package com.dongzili.easysearch.common.aspect;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 请求拦截器，负责在请求进入时生成 traceId，请求结束时清理
 */
public class TraceIdInterceptor implements HandlerInterceptor {

    /**
     * 请求到达时执行：生成或获取 traceId 并设置到 ThreadLocal
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 优先从请求头获取（支持分布式调用传递）
        String traceId = request.getHeader("X-Trace-Id");
        // 若没有则生成新的
        if (traceId == null || traceId.trim().isEmpty()) {
            traceId = TraceIdUtils.generateTraceId();
        }
        // 设置到当前线程
        TraceIdUtils.setTraceId(traceId);
        // 将 traceId 放入响应头，方便前端获取
        response.setHeader("X-Trace-Id", traceId);
        return true;
    }

    /**
     * 请求完成后执行：清理 ThreadLocal 中的 traceId
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        TraceIdUtils.clear();
    }
}
    